// ==UserScript==
// @name NCVT Beta
// @version 0.1.2
// @description NCVT,官网:xianyuhekouchou.me
// @author NCVT
// @homepage https://www.xianyuhekouchou.me/
// @match https://static.fifedu.com/*
// @match https://class.bigdata.ncvt.net/*
// @run-at document-end
// ==/UserScript==
//fif全局变量
var fif_score = [];
//fif全局变量
//NCVT请求主机
var NcvtIP = "https://class.bigdata.ncvt.net/";
//post请求
function NCVTpost(url, data, succ) {
$.ajax({
url: NcvtIP + url,
type: "post",
data: data,
header: {
"Content-Type": "application/x-www-form-urlencoded",
},
timeout: 5000,
success: function(res) {
succ(res);
},
error: function(xhr, type, errorThrown) {
console.log("出错了");
},
});
}
//get请求
function NCVTget(url, data, succ) {
$.ajax({
url: NcvtIP + url,
type: "get",
data: data,
dataType: "text/html",
timeout: 5000,
success: function(res) {
succ(res);
},
error: function(xhr, type, errorThrown) {
console.log("出错了");
},
});
}
// fif口语功能实现区
function fifedu() {
(function() {
const targetURL = "https://moral.fifedu.com/kyxl-app-challenge/evaluation/submitChallengeResults";
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
// 调用原始的open方法
this._url = url; // 保存URL供稍后使用
this._method = method; // 保存方法供稍后使用
return originalOpen.apply(this, arguments);
};
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data) {
// 拦截向特定URL发送的POST请求
if (this._method === "POST" && this._url === targetURL) {
// 尝试修改请求体(string格式)
if (typeof data === "string") {
try {
// 把字符串转换成对象方便操作
let tmptext = "";
let tmpjson = {};
tmptext = decodeURIComponent(data);
tmptext
.trim()
.split("&")
.forEach((item) => (tmpjson[item.split("=")[0]] = item.split("=")[1]));
tmpjson.resultJson = JSON.parse(tmpjson.resultJson);
//分数处理
tmpjson.resultJson.map((item) => {
// 发音
item.accuracy = fif_score[0];
// 流利度
item.fluency = fif_score[1];
// 完整度
item.complete = fif_score[2];
// 最终分数
item.score = fif_score[3];
//单词细节
let str = item.ansDetail;
let newStr = str.replace(/#.*$/, `#${fif_score[4]}`); // 使用正则表达式替换"#"后面的所有内容
item.ansDetail = newStr;
});
//分数处理
// 将修改好的对象重新转回字符串
tmptext = "";
tmptext += "taskId=" + tmpjson.taskId;
tmptext += "&levelId=" + tmpjson.levelId;
tmptext += "&studentId=" + tmpjson.studentId;
tmptext += "&resultJson=" + encodeURIComponent(JSON.stringify(tmpjson.resultJson));
data = tmptext;
} catch (e) {
console.log("出错了");
}
}
}
// 调用原始的send方法发送请求
originalSend.call(this, [data]);
};
})();
}
// NCVT功能实现区
//变量定义
var allVideos_p = 1;
var allVideos_maxID = null;
var allVideos = [];
//获取所有未入库课程
function getallVideos() {
NCVTpost("Student/Course/getCoursesCanApply.html", {
p: allVideos_p,
maxID: allVideos_maxID,
}, (succ) => {
//返回的是字符串,需要转成对象然后操作
let tmp = JSON.parse(succ);
//判断是不是第一次获取就已经没有课程了
if (tmp[1].length === 0 && allVideos_p === 1) {
return mui.alert("您没有可以入库的课程了", "提示", "确定", function() {}, "div");
}
//获取了全部课程后询问用户是否调用入库函数发送入库请求
if (tmp[1].length === 0) {
return mui.confirm(`获取完毕,要入库共${allVideos.length}个课程吗?`, "提示", ["取消", "确认"],
function(e) {
if (e.index === 1) {
checkVideos();
}
}, "div"
);
}
//将获取到的课程填充到数组内
tmp[1].map((item) => {
allVideos.push(item);
});
//请求参数改变
allVideos_maxID = tmp[0];
allVideos_p++;
//课程如果没有获取完毕的话就自我调用继续获取
getallVideos();
});
}
//变量定义
var allVideos_num = 0;
//入库课程
function checkVideos() {
allVideos.map((item) => {
NCVTpost("Student/Course/courseRegister.html", {
courseID: item.courseID,
}, (res) => {
if (res == "1") {
allVideos_num++;
}
if (allVideos_num === allVideos.length) {
mui.alert("入库完成,稍后将为您刷新页面", "提示", "确定", function(e) {
if (e.index === 0) {
location.reload();
}
}, "div");
}
});
});
}
//变量定义
var allxxzVideos_p = 1;
var allxxzVideos_maxID = null;
var allxxzVideos = [];
var handler = (event) => {
stop_allxxzVideos();
};
//变量定义
//获取所有学习中的课程
function getallxxzVideos() {
NCVTpost("Student/My/myCourse_xxz.html", {
p: allxxzVideos_p,
maxRegisterTime: allxxzVideos_maxID,
}, (succ) => {
let tmp = JSON.parse(succ);
if (allxxzVideos_p === 1 && tmp[1].length === 0) {
return mui.alert("您没有学习中的课程了", "提示", "确定", function(e) {}, "div");
}
if (tmp[1].length === 0) {
mui.confirm(`获取完成,共${allxxzVideos.length}个课程,要开始学习吗?因脚本与页面共存,所以请勿对面进行刷新和回退等操作`, "提示", ["取消", "确认"],
function(e) {
if (e.index === 1) {
start_allxxzVideos();
}
}, "div"
);
return;
}
allxxzVideos_maxID = tmp[0];
allxxzVideos_p++;
tmp[1].map((item) => {
// 二课的所有课程返回有bug,会返回相同的数据,所有有这个应对方法
const result = allxxzVideos.find(obj => obj['courseID'] == item.courseID);
if (result != undefined) return
allxxzVideos.push(item);
});
getallxxzVideos();
});
}
// 开始学习课程
function start_allxxzVideos() {
//计量器
let all_arrnum = 0;
allxxzVideos.map((item) => {
NCVTpost("Student/Course/getSecondsAndRemmberStartTime.html", {
courseID: item.courseID,
}, (succ) => {
item.remainder = succ;
all_arrnum++;
if (all_arrnum === allxxzVideos.length) {
//按剩余秒数排序
allxxzVideos.sort((a, b) => {
return a.remainder - b.remainder;
});
//渲染dom
xxzpages_dom();
//停止学习按钮监听
mui("#stop_botton")[0].addEventListener("tap", handler);
}
});
});
}
//dom重新渲染
function xxzpages_dom() {
mui("#ajaxbox1")[0].innerHTML = "";
allxxzVideos.map((item) => {
mui("#ajaxbox1")[0].innerHTML += `
剩余 ${item.remainder} 秒${item.courseName}